package com.cencat.order.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.order.dto.DriverDTO;
import com.cencat.order.entity.Driver;
import com.cencat.order.vo.DriverVO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 司机业务逻辑接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
public interface DriverService extends IService<Driver> {

    /**
     * 分页查询司机列表
     *
     * @param page 分页参数
     * @param driverName 司机姓名(模糊查询)
     * @param driverCode 司机编号(模糊查询)
     * @param phone 手机号码(模糊查询)
     * @param driverStatus 司机状态
     * @param onlineStatus 在线状态
     * @param certificationStatus 认证状态
     * @param vehicleType 车辆类型
     * @param startTime 创建开始时间
     * @param endTime 创建结束时间
     * @return 司机分页列表
     */
    IPage<DriverVO> getDriverPage(Page<DriverVO> page,
                                 String driverName,
                                 String driverCode,
                                 String phone,
                                 Integer driverStatus,
                                 Integer onlineStatus,
                                 Integer certificationStatus,
                                 String vehicleType,
                                 LocalDateTime startTime,
                                 LocalDateTime endTime);

    /**
     * 根据司机编号查询司机信息
     *
     * @param driverCode 司机编号
     * @return 司机信息
     */
    DriverVO getByDriverCode(String driverCode);

    /**
     * 根据手机号码查询司机信息
     *
     * @param phone 手机号码
     * @return 司机信息
     */
    DriverVO getByPhone(String phone);

    /**
     * 根据身份证号查询司机信息
     *
     * @param idCard 身份证号
     * @return 司机信息
     */
    Driver getByIdCard(String idCard);

    /**
     * 根据驾驶证号查询司机信息
     *
     * @param drivingLicense 驾驶证号
     * @return 司机信息
     */
    Driver getByDrivingLicense(String drivingLicense);

    /**
     * 查询指定范围内的在线司机
     *
     * @param longitude 经度
     * @param latitude 纬度
     * @param radius 搜索半径(公里)
     * @param vehicleType 车辆类型
     * @param loadCapacity 最小载重要求
     * @return 司机列表
     */
    List<DriverVO> getOnlineDriversInRange(BigDecimal longitude,
                                          BigDecimal latitude,
                                          BigDecimal radius,
                                          String vehicleType,
                                          BigDecimal loadCapacity);

    /**
     * 查询司机统计信息
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 统计信息
     */
    Map<String, Object> getDriverStatistics(Long driverId,
                                           LocalDateTime startTime,
                                           LocalDateTime endTime);

    /**
     * 创建司机信息
     *
     * @param driverDTO 司机数据传输对象
     * @return 创建结果
     */
    boolean createDriver(DriverDTO driverDTO);

    /**
     * 更新司机信息
     *
     * @param driverId 司机ID
     * @param driverDTO 司机数据传输对象
     * @return 更新结果
     */
    boolean updateDriver(Long driverId, DriverDTO driverDTO);

    /**
     * 更新司机位置信息
     *
     * @param driverId 司机ID
     * @param longitude 经度
     * @param latitude 纬度
     * @param address 详细地址
     * @return 更新结果
     */
    boolean updateDriverLocation(Long driverId,
                                BigDecimal longitude,
                                BigDecimal latitude,
                                String address);

    /**
     * 更新司机状态
     *
     * @param driverId 司机ID
     * @param driverStatus 司机状态
     * @param remark 备注
     * @return 更新结果
     */
    boolean updateDriverStatus(Long driverId,
                              Integer driverStatus,
                              String remark);

    /**
     * 更新司机在线状态
     *
     * @param driverId 司机ID
     * @param onlineStatus 在线状态
     * @return 更新结果
     */
    boolean updateOnlineStatus(Long driverId, Integer onlineStatus);

    /**
     * 更新司机认证状态
     *
     * @param driverId 司机ID
     * @param certificationStatus 认证状态
     * @param certificationRemark 认证备注
     * @return 更新结果
     */
    boolean updateCertificationStatus(Long driverId,
                                     Integer certificationStatus,
                                     String certificationRemark);

    /**
     * 更新司机车辆信息
     *
     * @param driverId 司机ID
     * @param vehicleId 车辆ID
     * @param vehicleType 车辆类型
     * @param vehiclePlate 车牌号
     * @param loadCapacity 载重能力
     * @param volumeCapacity 体积容量
     * @return 更新结果
     */
    boolean updateVehicleInfo(Long driverId,
                             Long vehicleId,
                             String vehicleType,
                             String vehiclePlate,
                             BigDecimal loadCapacity,
                             BigDecimal volumeCapacity);

    /**
     * 更新司机评分信息
     *
     * @param driverId 司机ID
     * @param rating 评分
     * @param ratingCount 评分次数
     * @return 更新结果
     */
    boolean updateRatingInfo(Long driverId,
                            BigDecimal rating,
                            Integer ratingCount);

    /**
     * 批量更新司机状态
     *
     * @param driverIds 司机ID列表
     * @param driverStatus 司机状态
     * @return 更新结果
     */
    boolean batchUpdateDriverStatus(List<Long> driverIds, Integer driverStatus);

    /**
     * 司机登录
     *
     * @param phone 手机号码
     * @param password 密码
     * @return 登录结果
     */
    Map<String, Object> driverLogin(String phone, String password);

    /**
     * 司机登出
     *
     * @param driverId 司机ID
     * @return 登出结果
     */
    boolean driverLogout(Long driverId);

    /**
     * 司机接单
     *
     * @param driverId 司机ID
     * @param orderId 订单ID
     * @return 接单结果
     */
    boolean acceptOrder(Long driverId, Long orderId);

    /**
     * 司机拒单
     *
     * @param driverId 司机ID
     * @param orderId 订单ID
     * @param rejectReason 拒单原因
     * @return 拒单结果
     */
    boolean rejectOrder(Long driverId, Long orderId, String rejectReason);

    /**
     * 司机开始配送
     *
     * @param driverId 司机ID
     * @param orderId 订单ID
     * @return 开始配送结果
     */
    boolean startDelivery(Long driverId, Long orderId);

    /**
     * 司机完成配送
     *
     * @param driverId 司机ID
     * @param orderId 订单ID
     * @param deliveryProof 配送凭证
     * @return 完成配送结果
     */
    boolean completeDelivery(Long driverId, Long orderId, String deliveryProof);

    /**
     * 查询司机订单历史
     *
     * @param driverId 司机ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param orderStatus 订单状态
     * @param limit 查询数量限制
     * @return 订单历史列表
     */
    List<Map<String, Object>> getDriverOrderHistory(Long driverId,
                                                   LocalDateTime startTime,
                                                   LocalDateTime endTime,
                                                   Integer orderStatus,
                                                   Integer limit);

    /**
     * 查询司机收入统计
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 收入统计信息
     */
    Map<String, Object> getDriverIncomeStatistics(Long driverId,
                                                 LocalDateTime startTime,
                                                 LocalDateTime endTime);

    /**
     * 查询司机工作时长统计
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 工作时长统计信息
     */
    Map<String, Object> getDriverWorkTimeStatistics(Long driverId,
                                                   LocalDateTime startTime,
                                                   LocalDateTime endTime);

    /**
     * 查询司机配送效率统计
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 配送效率统计信息
     */
    Map<String, Object> getDriverDeliveryEfficiencyStatistics(Long driverId,
                                                             LocalDateTime startTime,
                                                             LocalDateTime endTime);

    /**
     * 查询司机评价统计
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 评价统计信息
     */
    Map<String, Object> getDriverRatingStatistics(Long driverId,
                                                 LocalDateTime startTime,
                                                 LocalDateTime endTime);

    /**
     * 查询司机违规记录
     *
     * @param driverId 司机ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 违规记录列表
     */
    List<Map<String, Object>> getDriverViolationRecords(Long driverId,
                                                       LocalDateTime startTime,
                                                       LocalDateTime endTime);

    /**
     * 查询司机培训记录
     *
     * @param driverId 司机ID
     * @return 培训记录列表
     */
    List<Map<String, Object>> getDriverTrainingRecords(Long driverId);

    /**
     * 查询司机考核记录
     *
     * @param driverId 司机ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 考核记录列表
     */
    List<Map<String, Object>> getDriverAssessmentRecords(Long driverId,
                                                        LocalDateTime startTime,
                                                        LocalDateTime endTime);

    /**
     * 查询司机奖惩记录
     *
     * @param driverId 司机ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 奖惩记录列表
     */
    List<Map<String, Object>> getDriverRewardPunishmentRecords(Long driverId,
                                                              LocalDateTime startTime,
                                                              LocalDateTime endTime);

    /**
     * 查询司机保险信息
     *
     * @param driverId 司机ID
     * @return 保险信息
     */
    Map<String, Object> getDriverInsuranceInfo(Long driverId);

    /**
     * 查询司机健康档案
     *
     * @param driverId 司机ID
     * @return 健康档案信息
     */
    Map<String, Object> getDriverHealthRecord(Long driverId);

    /**
     * 查询司机紧急联系人信息
     *
     * @param driverId 司机ID
     * @return 紧急联系人信息列表
     */
    List<Map<String, Object>> getDriverEmergencyContacts(Long driverId);

    /**
     * 查询司机银行卡信息
     *
     * @param driverId 司机ID
     * @return 银行卡信息列表
     */
    List<Map<String, Object>> getDriverBankCards(Long driverId);

    /**
     * 查询司机设备信息
     *
     * @param driverId 司机ID
     * @return 设备信息
     */
    Map<String, Object> getDriverDeviceInfo(Long driverId);

    /**
     * 查询司机APP使用统计
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return APP使用统计信息
     */
    Map<String, Object> getDriverAppUsageStatistics(Long driverId,
                                                   LocalDateTime startTime,
                                                   LocalDateTime endTime);

    /**
     * 查询司机行为分析
     *
     * @param driverId 司机ID
     * @param startTime 分析开始时间
     * @param endTime 分析结束时间
     * @return 行为分析结果
     */
    Map<String, Object> getDriverBehaviorAnalysis(Long driverId,
                                                 LocalDateTime startTime,
                                                 LocalDateTime endTime);

    /**
     * 查询司机风险评估
     *
     * @param driverId 司机ID
     * @return 风险评估结果
     */
    Map<String, Object> getDriverRiskAssessment(Long driverId);

    /**
     * 查询司机推荐订单
     *
     * @param driverId 司机ID
     * @param limit 推荐数量限制
     * @return 推荐订单列表
     */
    List<Map<String, Object>> getRecommendedOrders(Long driverId, Integer limit);

    /**
     * 查询司机配送路径优化建议
     *
     * @param driverId 司机ID
     * @param orderIds 订单ID列表
     * @return 路径优化建议
     */
    Map<String, Object> getDeliveryRouteOptimization(Long driverId, List<Long> orderIds);

    /**
     * 软删除司机信息
     *
     * @param driverId 司机ID
     * @return 删除结果
     */
    boolean softDeleteDriver(Long driverId);

    /**
     * 批量软删除司机信息
     *
     * @param driverIds 司机ID列表
     * @return 删除结果
     */
    boolean batchSoftDeleteDrivers(List<Long> driverIds);

    /**
     * 恢复已删除的司机信息
     *
     * @param driverId 司机ID
     * @return 恢复结果
     */
    boolean restoreDriver(Long driverId);

    /**
     * 查询司机登录日志
     *
     * @param driverId 司机ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param limit 查询数量限制
     * @return 登录日志列表
     */
    List<Map<String, Object>> getDriverLoginLogs(Long driverId,
                                                LocalDateTime startTime,
                                                LocalDateTime endTime,
                                                Integer limit);

    /**
     * 查询司机操作日志
     *
     * @param driverId 司机ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param limit 查询数量限制
     * @return 操作日志列表
     */
    List<Map<String, Object>> getDriverOperationLogs(Long driverId,
                                                    LocalDateTime startTime,
                                                    LocalDateTime endTime,
                                                    Integer limit);
}